#pragma once
#include<regex>
#include<iostream>
#include<string>
#include<unordered_map>

//响应信息要素：
//状态行:状态码
//响应头部信息
//响应正文
//重定向标志
//重定向的url

//功能:
//重置响应头
//设置响应头部信息
//查询是否存在某个响应头部信息
//获取某个响应头部信息
//设置响应正文，以及正文的类型
//设置重定向
//判断是否为短连接
class HttpResponse{
public:
    int _status;//状态码
    std::unordered_map<std::string, std::string> _headers;//响应头部信息
    std::string _body;//响应正文
    bool _redirect_flag;//重定向标志
    std::string _redirect_url;//重定向的url

    HttpResponse(int status = 200)
    :_status(status)
    ,_redirect_flag(false)
    {}

    //重置响应
    void Reset()
    {
        _status = 200;
        _headers.clear();
        _body.clear();
        _redirect_flag = false;
        _redirect_url.clear();
    }

    //设置响应头部信息
   void SetHeader(const std::string& key, const std::string& val)
    {
        _headers.insert(std::make_pair(key, val));
        return;
    }
    //查询某个响应头部信息是否存在
    bool HasHeader(const std::string& key) const
    {
        auto it = _headers.find(key);
        if(it != _headers.end())
        {
            return true;
        }
        return false;
    }
    //获取某个响应头部信息
    std::string GetHeader(const std::string& key) const
    {
        auto it = _headers.find(key);
        if(it != _headers.end())
        {
            return "";
        }
        return it->second;
    }

    //设置响应正文，以及正文的类型
    void SetContent(const std::string& body, const std::string& type = "text/html")
    {
        _body = body;
        SetHeader("Content-Type", type);
    }
    //设置重定向
    void SetRedirect(const std::string& redirect_url, int status = 302)
    {
        _status = status;        
        _redirect_flag = true;
        _redirect_url = redirect_url;
    }
    //判断是否为短连接
    bool Close() const
    {
        if(HasHeader("Connection") == true && GetHeader("Connection") == "keep-alive")
        {
            return false;
        }
        else
        {
            return true;
        }
    }
};
